Invalid principal in policyが出たら確認したい!IAMロール・IAMユーザーが削除されるとPrincipal要素のARNがプリンシパルIDに置き換わります
データアナリティクス事業本部インテグレーション部機械学習チーム・新納(にいの)です。最近躓いたIAMに関する小ネタをお届けします。
S3バケットポリシーのPrincipal要素に謎のIDが指定されている
皆さんは、バケットポリシーを確認したときに心当たりのない謎のIDがPrincipal要素に指定されていた経験はありませんか?私はあります。
IAMロール・IAMユーザーが削除されるとARNがプリンシパルIDに置き換わる
このIDの正体はIAMロール・IAMユーザーが削除された際にARNから置き換えられるプリンシパルIDです。
Principal要素に指定されたIAMロール・IAMユーザーは、このプリンシパルIDに変換されます。IAM ユーザーであればAIDA
、IAM ロールであればAROA
というプレフィックスを持ちます。
ところが、IAMロール・IAMユーザーが存在しない場合は有効なARNにマッピングできず、プリンシパルIDのみが表示されます。
参考:
Principal要素をこのままにしておくと、特にバケットポリシーを編集する際にInvalid principal in policy
というエラーが発生します。
Invalid principal in policyが出たらまず確認すること
S3バケットポリシーのエラーでInvalid principal in policy
が表示されたら、まずは以下の要素を確認します。
- Principal要素に以下を指定していないこと
- 存在しないAWS アカウント
- 存在しないAWS アカウントがARNに含まれている
- 存在しないIAMユーザー・IAMロール
- 特にCloudFormationでIAMロールやIAMユーザーを作成している場合、バケットポリシーの作成がPrincipalに指定するIAMロール・IAMユーザーの作成よりも先に完了していないこと
- Principal要素の書き方が有効なフォーマットに沿っている
参考:
今回は「存在しない IAM ユーザーもしくは IAM ロール」が指定されていることが原因ですので、プリンシパルIDを有効なARNに置き換える必要があります。
CloudFormationやCDKでS3バケットを管理している場合
CloudFormationやCDKでS3バケットを定義している場合、どの部分でエラーが発生しているのか分かりにくく、なかなか原因箇所に気付きづらいかもしれません。どの行でエラーが発生しているか、エラーメッセージからは読み取りにくいためです。
このような場合は、テンプレートに記述したバケットポリシーをS3バケットのマネジメントコンソール画面に貼り付けて確認すると問題箇所を指摘してくれます。
最後に
IAMロール・IAMユーザーが削除されるとPrincipal要素に指定したARNがプリンシパルIDとして表示され、Invalid principal in policy
の原因となり得るという話でした。特に既存のポリシーに追加をしたい場合などで、過去分のPrincipalが置き換えられてる場合はなかなか気付きづらいかと思います。AIDA
、AROA
の心当たりのないプレフィックスを持ったIDを見つけたらこのブログを思い出していただけると幸いです。